package com.heima.comment.service.impl;

import com.heima.comment.service.ApCommentHotService;
import com.heima.model.comment.pojos.ApComment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class ApCommentHotServiceImpl implements ApCommentHotService {

    @Autowired
    private MongoTemplate mongoTemplate;


    /**
     * 异步计算热点评论
     * @param apComment 当前评论
     */
    @Async("taskExecutor")
    @Override
    public void computeHotComment(ApComment apComment) {
        //1.查询mongo中已有的全部热点评论列表（查询条件：文章ID、类型、flag  结果：点赞数倒排序）
        List<ApComment> apCommentHotList = mongoTemplate.find(Query.query(
                Criteria.where("objectId").is(apComment.getObjectId())
                        .and("type").is(apComment.getType())
                        .and("flag").is(1)
        ).with(Sort.by(Sort.Direction.DESC,"likes")), ApComment.class);

        //2.判断如果当前列表数量不足5条，直接保存当前评论为热点评论
        if(apCommentHotList.size()<5){
            apComment.setFlag(1);//设置为热点评论
            apComment.setUpdatedTime(new Date());
            mongoTemplate.save(apComment);
        } else {
            //3.如果当前列表数量大于等于5条，比较点赞数

            //取出热点评论列表中最后一条评论
            ApComment apCommentLast = apCommentHotList.get(apCommentHotList.size() - 1);
            //比较点赞数，如果大于最后一条评论点赞数则替换掉
            if(apComment.getLikes()>apCommentLast.getLikes()){
                apCommentLast.setFlag(0);//设置为普通评论
                apCommentLast.setUpdatedTime(new Date());
                mongoTemplate.save(apCommentLast);

                apComment.setFlag(1);//设置为热点评论
                apComment.setUpdatedTime(new Date());
                mongoTemplate.save(apComment);
            }

        }

    }
}
